<?php
namespace Swiftx\Interfaces\Router;

/**
 * 资源请求接口
 * @package Swiftx\Router
 */
interface Request {

    /** 未完成状态 */
    const UnFinished = 000;

    /** 请求处理成功 */
    const Success = 200;

    /** 请求重定向 */
    const Redirect = 300;

    /** 请求参数错误 */
    const Substandard = 400;

    /** 无法正确响应 */
    const Error = 500;

    /**
     * 获取协议类型
     * @return string
     */
    public function setProtocol(string $value);

    /**
     * 获取协议类型
     * @return string
     */
    public function getProtocol():string ;


    /**
     * 设置主机名
     * @param string $value
     */
    public function setHost(string $value);

    /**
     * 读取主机名
     * @return string
     */
    public function getHost():string;

    /**
     * 设置端口号
     * @param int $value
     */
    public function setPort(int $value);

    /**
     * 读取端口号
     * @return int
     */
    public function getPort():int;

    /**
     * 设置请求文档
     * @param string $value
     * @return void
     */
    public function setDocument(string $value);

    /**
     * 获取请求目标
     * @return string
     */
    public function getDocument(): string;

    /**
     * 设置状态码
     * @param int $value
     * @return void
     */
    public function setStatus(int $value);

    /**
     * 获取状态码
     * @return int
     */
    public function getStatus():int;

    /**
     * 设置请求方式
     * @param string $value
     * @return void
     */
    public function setMethod(string $value);

    /**
     * 获取请求方式
     * @return string
     */
    public function getMethod():string ;

    /**
     * 设置时间戳
     * @param int $timestamp
     */
    public function setCreateTime(int $timestamp);

    /**
     * 获取时间戳
     * @return int
     */
    public function getCreateTime():int;

    /**
     * 设置请求参数
     * @param string $key
     * @param mixed $value
     */
    public function setParam(string $key, $value);

    /**
     * 批量设置参数
     * @param array $data
     */
    public function setParams(array $data);

    /**
     * 是否有请求参数
     * @param string $key
     * @return bool
     */
    public function hasParam(string $key):bool ;

    /**
     * 读取请求参数
     * @param string $key
     * @param mixed $default
     * @return mixed
     */
    public function getParam(string $key, $default=null);

    /**
     * 批量读取参数
     * @return array
     */
    public function getParams():array ;

}